两个月前,我通过 Vibe Coding部署了一个极其简单的全栈项目:一个仅供我个人使用的 Todo List。

在那之前,我并不熟悉 Docker,但这不妨碍项目跑起来。AI 填补了技能的真空,不仅写了业务逻辑,还给出了部署配置。项目很小,数据很少,这种“用自然语言控制软件构建”的流畅感,很容易让人产生一种错觉:我既然能通过对话轻松构建它,自然也能通过对话轻松维护它。

直到昨天,这种错觉导致了一次彻底的数据归零。

为了将后端服务从 OpenResty 迁移到 Dokploy,我需要调整容器配置。在执行 docker-compose up -d 重建容器之前,我特意询问了 AI:“这会覆盖我的数据吗?”

AI 检查了我的 docker-compose.yml,看到了 volumes 挂载配置,于是信誓旦旦地回复:不会,数据是持久化的。

我按下了回车。几秒钟后,容器重建完成,那个仅存有几十条个人待办事项的数据库,消失了。

虽然损失的只是几周的个人记录,数据量不过 24KB,且只有我一个用户,但这次“微型事故”暴露出的问题却具有普遍性:它不是因为 AI 说了谎,而是因为它“看不见”。它看见了显性的配置文本,却看不见隐性的运行时状态。

这次经历让我意识到,即便是面对最微小的个人项目,在 Vibe Coding 的极速体验中,也存在几条必须人工介入的“红线”。

红线一:物理路径的“运行时对齐”

在这次事故中,我的 docker-compose.yml 确实配置了挂载卷:- backend_data:/data。在 AI 的文本逻辑里,只要有 Volume,数据就是安全的。

然而,后端代码中(config.py)关于数据库路径的逻辑是隐蔽的。由于环境变量读取失败,代码回退到了默认值,使用了相对路径 ./data/todo.db。在容器内,这指向了 /app/data/todo.db

这就是 Vibe Coding 最大的盲区:语义的割裂

AI 并没有把“基础设施层的挂载路径”和“应用层的写入路径”进行运行时对齐。它不知道 Docker 里的 /data 和 Python 里的 /app/data 是两个完全平行的宇宙。

我之前的懈怠在于,觉得“反正只是个个人小项目”,AI 应该能处理好这些默认配置。但实际上,除非我显式地要求它检查这两个路径的一致性,否则它只会分别验证两段代码的语法正确性,而忽略它们组合在一起时的逻辑谬误。

修正认知: 对于文件系统、数据库文件,不能依赖 AI 的“默认推断”。必须人工进入容器(docker exec),确认程序真的写到了我以为它该写的地方。代码里的路径字符串,和容器里的物理挂载点,必须由人眼进行最后一次校准。

红线二:环境变量的穿透链条

事故的另一个诱因是环境变量失效。

在 Vibe Coding 中,我很习惯让 AI 生成 .env 文件,然后就不再管了。我认为只要文件在那里,变量就会生效。

但实际上,从 .envdocker-compose,再到 Dockerfile,最后到 Python 进程,这是一条脆弱的传递链。任何一个环节的拼写错误或传递遗漏,都会导致应用层读不到变量。

关键在于,当读不到变量时,现代框架往往有“优雅”的默认值(Fallback)。这种“优雅”掩盖了配置的错误。我的程序默默地回退到了默认路径,没有报错,没有崩溃,只是静悄悄地把数据写错了地方。

修正认知: 环境变量的穿透性是不可见的。AI 倾向于假设配置即生效。我需要在代码中加入显式的启动检查——如果没有读到关键配置(如 DB_URL),应用应该直接崩溃(Crash)。"Fail Fast"(快速失败)比“智能容错”更重要,因为前者能暴露 AI 的配置盲区。

红线三:破坏性操作的“冷备份”意识

我曾天真地认为,询问 AI “这样安全吗”是一种风控手段。

事实证明,这是无效的。AI 没有痛感,它对“删除容器”和“打印一行日志”的心理负担是一样的。它对风险的评估基于文本逻辑,而非资产价值。

尤其是面对这种“只有我一个人用”的小项目时,我更容易放松警惕,跳过备份步骤。但机器是冷酷的,它不会因为数据只有 24KB 就手下留情。

修正认知: 在敲下任何可能触发 recreate(重建)或 remove(删除)的 Docker 命令之前,必须切断对 AI 判断的依赖。

无论项目多小,无论 AI 多么确信“Volume 依然存在”,我都必须先在宿主机上执行 cp 命令,手动备份数据文件。验证权必须收回到自己手中。不问 AI “会不会丢”,只问自己“备份在哪”。

结语

Vibe Coding 依然是强大的。它让我在没有专业运维背景的情况下,依然能独立构建出这个小工具。

但这次数据的丢失提醒我:代码可以由 AI 生成,但系统的状态(State)必须由我来定义。

无状态的逻辑(函数、组件、样式)可以放心地交给 AI 去“Vibe”;但有状态的设施(数据库、文件卷),哪怕再小,也是系统生存的根基。在这些红线面前,必须暂停“直觉”,回归“工程”。

不是因为 AI 不够聪明,而是因为它无法为我的数据负责,哪怕那只是一份 24KB 的待办清单。